﻿using System;
using System.Data.SqlClient;
using System.Collections.Generic;
using Business_Entity;
using System.Data.SqlClient;
using System.Data;
namespace DAOFactory
{
    public class DAOOrdenCompra
    {
        public DAOOrdenCompra()
        {
        }
        public static int AddDBOrdenCompra(BEOrdenCompra beOC)
        {
            SqlCommand cmd = new SqlCommand("COMPRA_AGREGAR_ORDEN_COMPRA_M", ConnectionManager.getConnection());
            cmd.CommandType = CommandType.StoredProcedure;
			
            cmd.Parameters.Add("@Codigo", SqlDbType.Int);
            cmd.Parameters["@Codigo"].Direction = ParameterDirection.Output;
            cmd.Parameters.Add("@FechaIni", SqlDbType.VarChar);
            cmd.Parameters["@FechaIni"].Value = beOC.fechaPedido;
            cmd.Parameters.Add("@FechaFin", SqlDbType.VarChar);
            cmd.Parameters["@FechaFin"].Value = beOC.fechaEntrega;
            cmd.Parameters.Add("@MontoTotal", SqlDbType.Float);
            cmd.Parameters["@MontoTotal"].Value = Math.Round(beOC.precioTotal,3);
            cmd.Parameters.Add("@Proveedor", SqlDbType.VarChar);
            cmd.Parameters["@Proveedor"].Value = beOC.Proveedor.RazonSocial;
            cmd.Parameters.Add("@TotalProd",SqlDbType.Int);
            cmd.Parameters["@TotalProd"].Value=beOC.TotalProd;
            int cod;
            cmd.ExecuteNonQuery();			
			cod = (int) cmd.Parameters["@Codigo"].Value;		
            //ConnectionManager.closeConnection();
            return cod;

        }
        public static  void DeleteDBOrdenCompra(int id)
        {
            SqlCommand cmd = new SqlCommand("COMPRA_ELIMINAR_ORDEN_COMPRA_M", ConnectionManager.getConnection());
            cmd.CommandType = CommandType.StoredProcedure;

            cmd.Parameters.Add("@Codigo", SqlDbType.Int);
            cmd.Parameters["@Codigo"].Value = id;

            cmd.ExecuteNonQuery();
            //ConnectionManager.closeConnection();
        }
        public static void UpdateDBOrdenCompra(BEOrdenCompra beOC)
        {
            SqlCommand cmd = new SqlCommand("COMPRA_ACTUALIZAR_ORDEN_COMPRA_M", ConnectionManager.getConnection());
            cmd.CommandType = CommandType.StoredProcedure;
			
            
            cmd.Parameters.Add("@Codigo", SqlDbType.Int);
            cmd.Parameters["@Codigo"].Value = beOC.Id;
            cmd.Parameters.Add("@FechaIni", SqlDbType.VarChar);
            cmd.Parameters["@FechaIni"].Value = beOC.fechaPedido;
            cmd.Parameters.Add("@FechaFin", SqlDbType.VarChar);
            cmd.Parameters["@FechaFin"].Value = beOC.fechaEntrega;
            cmd.Parameters.Add("@MontoTotal", SqlDbType.Float);
            cmd.Parameters["@MontoTotal"].Value = Math.Round(beOC.precioTotal,3);
            cmd.Parameters.Add("@Total", SqlDbType.Int);
            cmd.Parameters["@Total"].Value = beOC.TotalProd;
            cmd.Parameters.Add("@Proveedor", SqlDbType.VarChar);
            cmd.Parameters["@Proveedor"].Value = beOC.Proveedor.RazonSocial;
            cmd.Parameters.Add("@Estado",SqlDbType.VarChar);
            cmd.Parameters["@Estado"].Value=beOC.EstadoOrdenCompra;
            cmd.ExecuteNonQuery();
            //ConnectionManager.closeConnection();
        }
        public static void AddDBLineaOrdenCompra(BELineaOrdenCompra beLOC, int IdOC)
        {
            SqlCommand cmd = new SqlCommand("COMPRA_AGREGAR_LINEA_ORDEN_COMPRA_M", ConnectionManager.getConnection());
            cmd.CommandType = CommandType.StoredProcedure;

            cmd.Parameters.Add("@CodigoOC", SqlDbType.Int);
            cmd.Parameters["@CodigoOC"].Value = IdOC;
            cmd.Parameters.Add("@IdProducto", SqlDbType.Int);
            cmd.Parameters["@IdProducto"].Value = beLOC.ProductoProveedor.Producto.Codigo;
            cmd.Parameters.Add("@Cantidad", SqlDbType.Int);
            cmd.Parameters["@Cantidad"].Value = beLOC.Cantidad;
            cmd.Parameters.Add("@Precio", SqlDbType.Float);
            cmd.Parameters["@Precio"].Value = Math.Round(beLOC.PrecioUnitario,3);
            cmd.Parameters.Add("@Subtotal", SqlDbType.Float);
            cmd.Parameters["@Subtotal"].Value = Math.Round(beLOC.PrecioTotal,3);
            cmd.ExecuteNonQuery();
            //ConnectionManager.closeConnection();

        }
        public static  void DeleteDBLineaOrdenCompra(int idLineaOrdenCompra)
        {
            SqlCommand cmd = new SqlCommand("COMPRA_ELIMINAR_LINEA_ORDEN_COMPRA_M", ConnectionManager.getConnection());
            cmd.CommandType = CommandType.StoredProcedure;

            cmd.Parameters.Add("@IDORDENCOMPRALINEA", SqlDbType.Int);
            cmd.Parameters["@IDORDENCOMPRALINEA"].Value = idLineaOrdenCompra;
            cmd.ExecuteNonQuery();
            //ConnectionManager.closeConnection();
        }
        public static void UpdateDBLineaOrdenCompra(BELineaOrdenCompra beloc)
        {
        	SqlCommand cmd = new SqlCommand("COMPRA_ACTUALIZAR_LINEA_ORDEN_COMPRA_M", ConnectionManager.getConnection());
            cmd.CommandType = CommandType.StoredProcedure;
			
            cmd.Parameters.Add("@Codigo", SqlDbType.Int);
            cmd.Parameters["@Codigo"].Value = beloc.Id;
            cmd.Parameters.Add("@Cantidad", SqlDbType.Int);
            cmd.Parameters["@Cantidad"].Value = beloc.Cantidad;
            cmd.Parameters.Add("@Precio", SqlDbType.Float);
            cmd.Parameters["@Precio"].Value = Math.Round(beloc.PrecioUnitario,3);
            cmd.Parameters.Add("@Subtotal", SqlDbType.Float);
            cmd.Parameters["@Subtotal"].Value = beloc.PrecioTotal;
            
            cmd.ExecuteNonQuery();
            
        }
        public static BEOrdenCompra getOrdenCompra(int id)
        {
            List<BEOrdenCompra> lstOrdenCompra = new List<BEOrdenCompra>();
            SqlCommand cmd = new SqlCommand("COMPRA_BUSCAR_ORDENES_COMPRA1_M", ConnectionManager.getConnection());
            cmd.CommandType = CommandType.StoredProcedure;

            cmd.Parameters.Add("@Codigo", SqlDbType.Int);
            cmd.Parameters["@Codigo"].Value = id;
            BEOrdenCompra oc = new BEOrdenCompra();

            SqlDataReader reader = cmd.ExecuteReader();
            while (reader.Read())
            {
            	String fechaIni = reader[1].ToString();
            	int idOC = int.Parse(reader[0].ToString());
            	String fechaFin = reader[2].ToString();
            	String Prov = reader[3].ToString();
            	int idProv= int.Parse(reader[4].ToString());
            	float MontoTot = float.Parse(reader[5].ToString());

                oc.Estado = 'A';
                oc.fechaEntrega = fechaFin;
                oc.fechaPedido = fechaIni;
                oc.Id = idOC;
                oc.Proveedor.RazonSocial = Prov;
                oc.Proveedor.IdProv=idProv;
                lstOrdenCompra.Add(oc);
            }
            reader.Close();
            //ConnectionManager.closeConnection();

            return oc;
        }
        public static List<BELineaOrdenCompra> getDBLineaOrdenCompra(int codigo)
        {
        	List<BELineaOrdenCompra> lstlineaOrdenCompra=new List<BELineaOrdenCompra>();
        	SqlCommand cmd = new SqlCommand("COMPRA_BUSCAR_ORDENES_COMPRA_LINEA_M", ConnectionManager.getConnection());
            cmd.CommandType = CommandType.StoredProcedure;

            cmd.Parameters.Add("@Codigo", SqlDbType.Int);
            cmd.Parameters["@Codigo"].Value = codigo;
            
            SqlDataReader reader = cmd.ExecuteReader();
            while (reader.Read())
            {
            	int idCodigoLOC=int.Parse(reader[0].ToString());
            	int idCodigoOC=int.Parse(reader[1].ToString());
            	int idCodigoP=int.Parse(reader[2].ToString());
            	String nombre=reader[3].ToString();
            	String DescripcionTP=reader[4].ToString();
            	int CodigoTP=int.Parse(reader[5].ToString());
            	//String RazonSocial=reader[6].ToString();
            	//int idProv=int.Parse(reader[7].ToString());
            	int cantidad=int.Parse(reader[6].ToString());
            	float precio=float.Parse(reader[7].ToString());
            	float subtotal=float.Parse(reader.GetDouble(8).ToString());
            	String Desc=reader[9].ToString();
            	BELineaOrdenCompra oc=new BELineaOrdenCompra();
                oc.Id=idCodigoLOC;
                oc.ProductoProveedor.Producto.Codigo=idCodigoP;
                oc.ProductoProveedor.Producto.Nombre=nombre;
                oc.ProductoProveedor.Producto.TipoProducto.Descripcion=DescripcionTP;
                oc.ProductoProveedor.Producto.TipoProducto.Codigo=CodigoTP;
                oc.ProductoProveedor.Producto.Descripcion=Desc;
                oc.PrecioUnitario=precio;
                oc.Cantidad=cantidad;
                oc.PrecioTotal=subtotal;
                lstlineaOrdenCompra.Add(oc);
            }
            reader.Close();
            return lstlineaOrdenCompra;
        }
        public static List<BEOrdenCompra> getordenesCompra(int Codigo, String FecIniFP, String FecFinFP,String FecIniFE,String FecFinFE,String Proveedor)
        {
            List<BEOrdenCompra> lstOrdenCompra = new List<BEOrdenCompra>();
            /*SqlCommand cmd = new SqlCommand("COMPRA_BUSCAR_ORDENES_COMPRA_M", ConnectionManager.getConnection());
            cmd.CommandType = CommandType.StoredProcedure;
			
            cmd.Parameters.Add("@Codigo", SqlDbType.Int);
            cmd.Parameters["@Codigo"].Value = Codigo;
            cmd.Parameters.Add("@FechaP", SqlDbType.VarChar);
            cmd.Parameters["@FechaP"].Value = FecIniFP;
            cmd.Parameters.Add("@FechaE", SqlDbType.VarChar);
            cmd.Parameters["@FechaE"].Value = FecFinFP;
            cmd.Parameters.Add("@idproveedor", SqlDbType.VarChar);
            cmd.Parameters["@idproveedor"].Value = Proveedor;
			*/
			String sql="SELECT a.idOrdenCompra,a.montoTotal,a.idProveedor,b.RazonSocial,"+
			"a.strFechaPedido,a.strFechaEntrega,a.CantidadTotal,c.Descripcion "+
			" FROM ORDENCOMPRA a,PROVEEDOR b,ESTADO_ORDEN_COMPRA c "+
			" WHERE a.idEstadoV='A' and a.idProveedor=b.idProveedor and "+" a.IDESTADOOC=c.idEstado" ;
			if (Codigo>0){sql+=" and a.idOrdenCompra="+Codigo;}
			else{
				if (Proveedor.CompareTo("Todos")!=0){
					sql+=" and a.idProveedor in (select c.idProveedor from PROVEEDOR c where c.RazonSocial=+'"+Proveedor+"') " ;
				}
				if (FecIniFP.CompareTo("")!=0)
				{
					sql+= " and '"+FecIniFP+"'<=strFechaPedido ";
				}
				if (FecFinFP.CompareTo("")!=0)
				{
					sql+= " and '"+FecFinFP+"'>=strFechaPedido ";
				}
				if (FecIniFE.CompareTo("")!=0)
				{
					sql+= " and '"+FecIniFE+"'<=strFechaEntrega ";
				}
				if (FecFinFE.CompareTo("")!=0)
				{
					sql+= " and '"+FecFinFE+"'>=strFechaEntrega ";
				}
			}
			sql+=" order by 1";
			SqlCommand cmd=new SqlCommand(sql,ConnectionManager.getConnection());
            SqlDataReader reader = cmd.ExecuteReader();
            while (reader.Read())
            {
            	/*int idCompra=int.Parse(reader[0].ToString());
            	float montototal=float.Parse(reader[1].ToString());
            	int idProveedor = int.Parse(reader[2].ToString());
            	String RazonSocial=reader[3].ToString();
            	String fecPed=reader[4].ToString();
            	String fecEnt=reader[5].ToString();
            	int tot=int.Parse(reader[6].ToString());
            	String Estado=reader[7].ToString();*/
            	int idCompra=reader.GetInt32(0);
            	double montototal=reader.GetDouble(1);
            	int idProveedor=reader.GetInt32(2);
            	String RazonSocial=reader.GetString(3);
            	String fecPed=reader.GetString(4);
            	String fecEnt=reader.GetString(5);
            	int tot=reader.GetInt32(6);
            	String Estado=reader.GetString(7);
            	
                BEOrdenCompra oc = new BEOrdenCompra();
                oc.Estado = 'A';
                oc.fechaEntrega = fecEnt;
                oc.fechaPedido = fecPed;
                oc.Proveedor.RazonSocial = RazonSocial;
                oc.Proveedor.IdProv = idProveedor;
                oc.precioTotal=float.Parse(montototal.ToString());
                oc.Id=idCompra;
                oc.EstadoOrdenCompra=Estado;
                oc.TotalProd=tot;
                lstOrdenCompra.Add(oc);
            }
            reader.Close();
            //ConnectionManager.closeConnection();

            return lstOrdenCompra;
        }
        public static List<String> BuscarDBEstadosOrdenesCompra(){
        	List<String> lstestados=new List<string>();
        	String sql="select Descripcion from ESTADO_ORDEN_COMPRA";
        	SqlCommand cmd=new SqlCommand(sql,ConnectionManager.getConnection());
            SqlDataReader reader = cmd.ExecuteReader();
            while (reader.Read())
            {
            	
            	String cad=reader.GetString(0);
            	lstestados.Add(cad);
            }
            reader.Close();
        	return lstestados;
        }
    }

}
